package ejemplo.sistemas;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;

import javax.swing.JComponent;

import ejemplo.componentes.interfaces.IManejable;
import ejemplo.componentes.interfaces.IMovil;
import es.componentes.Componente;
import es.subsistemas.Subsistema;

public class SubsistemaManejo implements Subsistema, KeyListener{
	
	/**
	 * KeyCodes asociados a cada una de las acciones implementadas por la interfaz IManejable
	 */
	private int accion1, accion2, accion3, iz, der, arr, ab;
	
	/**
	 * Teclas activas asociados a cada una de las acciones implementadas por la interfaz IManejable
	 */
	private boolean bAccion1, bAccion2, bAccion3, bIz, bDer, bArr, bAb;
	
	private ArrayList<IManejable> componentesManejables;
	
	public SubsistemaManejo(ArrayList<Componente> componentes, int iz,int  der, int arr, int ab) {
		this.iz = iz;
		this.der = der;
		this.arr = arr;
		this.ab = ab;
		this.componentesManejables = castComponentesIManejables(componentes);
	}

	private ArrayList<IManejable> castComponentesIManejables(ArrayList<Componente> componentes) {
		ArrayList<IManejable> iManejables = new ArrayList<IManejable>();
		for (Componente componente : componentes) {
			if(componente.getTipo().equals(getTipo()))
				iManejables.add((IManejable) componente);
		}
		return iManejables;
		
	}

	@Override
	public String getTipo() {
		return IManejable.ID_INTERFAZ;
	}

	@Override
	public void procesar(double delta) {
		for (IManejable manejable : componentesManejables) {
			procesarAcciones(manejable, delta);
		}
		
	}

	private void procesarAcciones(IManejable manejable, double delta) {
		if(bAccion1){
			manejable.ejecutarAccion1(delta);
		}
		if(bAccion2){
			manejable.ejecutarAccion2(delta);
		}
		if(bAccion3){
			manejable.ejecutarAccion3(delta);
		}
		if(bArr){
			manejable.pulsarArriba(delta);
		}
		if(bAb){
			manejable.pulsarAbajo(delta);
		}
		if(bIz){
			manejable.pulsarIzquierda(delta);
		}
		if(bDer){
			manejable.pulsarDerecha(delta);	
		}
		if(!bArr&&!bAb&&!bIz&&!bDer){
			manejable.noDireccionPulsada(delta);
		}	
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		procesarEntrada(arg0.getKeyCode(), true);
	}

	
	
	private void procesarEntrada(int keyCode, boolean pressRelease){
		if(keyCode==accion1){
			bAccion1 = pressRelease;
			return;
		}
		if(keyCode==accion2){
			bAccion2 = pressRelease;
			return;
		}
		if(keyCode==accion3){
			bAccion3 = pressRelease;
			return;
		}
		if(keyCode==arr){
			bArr = pressRelease;
			return;
		}
		if(keyCode==ab){
			bAb = pressRelease;
			return;
		}
		if(keyCode==iz){
			bIz = pressRelease;
			return;
		}
		if(keyCode==der){
			bDer= pressRelease;
			return;
		}
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		procesarEntrada(arg0.getKeyCode(), false);
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

}
